package com.AdvancedDemos.接口.JDK8之后接口的新特性;

public interface A {
    /**
     * 1.默认方法:必须使用default修饰,默认是public权限,且带方法体
     * 属于实例方法,需要通过 实现类对象 访问
     * <p>
     * 如果一个类同时实现两个接口,当中有签名完全相同的默认方法,会报错接口中的相同函数不相关,这种情况可以通过在实现类中重写同名方法来解决冲突 , 而同名同参数列表,返回值不同,也会因为冲突而报错,参数列表不同可以算作重载不报错
     * <p>
     * default函数不能用final修饰
     * <p>
     * 接口中的默认方法是可以在实现类重写的,但是重写是没有default修饰的,因为实现类是类不是接口
     */
    public default void test1() {//即使不写public也是默认public权限
        System.out.println("===默认方法被调用了===");
        test2();
    }

    /**
     * 2.私有方法(从JDK9开始支持):必须使用private修饰,且带方法体
     * 属于实例方法,接口无法实例化,而 实现类对象 也调不了,因为是接口私有的,但是可以在 默认方法 或 其他私有方法 内调用
     */

    private void test2() {
        System.out.println("===私有方法被调用了===");
    }

    /**
     * 3.类方法(静态方法):必须使用static修饰,默认就是public权限,且带方法体
     */
    public static void test3() {
        System.out.println("===静态方法被调用了===");//需要使用 接口名.静态方法名 来调用
    }

    /**
     *  为什么接口要新增3种方法?
     *
     *  1.增强接口的功能
     *  2.便于接口增加新的函数:当一接口已经被很多类实现了时,如果要新增一个函数,会导致所有的实现类都需要重写该方法,而现在允许接口中的函数带方法体后,只需要直接在接口中实现新增的功能即可,所有实现类自动可以拥有该方法
     */

}
